using System.Security.Cryptography;
﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace pos_trab_2.Model.Abstract
{
    [Serializable]
    public abstract class AutenticacaoBase
    {

        public string CodificaSenha(string Senha, string Chave)
        {
            byte[] resultado;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

            MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider();
            byte[] TDESKey = md5Provider.ComputeHash(UTF8.GetBytes(Chave));

            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();

            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.ISO10126;

            byte[] senhaParaCodificar = UTF8.GetBytes(Senha);

            try
            {
                ICryptoTransform codificador = TDESAlgorithm.CreateEncryptor();
                resultado = codificador.TransformFinalBlock(senhaParaCodificar, 0, senhaParaCodificar.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                md5Provider.Clear();
            }

            return Convert.ToBase64String(resultado);
        }

        public string DecodificaSenha(string Senha, string Chave)
        {
            byte[] resultado;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

            MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider();
            byte[] TDESKey = md5Provider.ComputeHash(UTF8.GetBytes(Chave));

            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();

            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.ISO10126;

            byte[] senhaParaDecodificar = Convert.FromBase64String(Senha);

            try
            {
                ICryptoTransform decodificador = TDESAlgorithm.CreateDecryptor();
                resultado = decodificador.TransformFinalBlock(senhaParaDecodificar, 0, senhaParaDecodificar.Length);
            }
            catch (Exception)
            {
                throw new Exception("Não foi possível recuperar a senha, a palavra-chave fornecida pode estar incorreta.");
            }
            finally
            {
                TDESAlgorithm.Clear();
                md5Provider.Clear();
            }

            return UTF8.GetString(resultado);
        }
    }
}